
I've been playing a new video game called The Bazaar recently (would highly recommend if you enjoy rogue-likes and deck building), and occasionally I record screen captures or photos of board states that I find particularly interesting.
Out of curiosity, I fed one of my own gameplay clips into Gemini 2.5 and asked it to explain what was going on — including a detailed breakdown of every action trigger.
I'll attach the results, but suffice to say: I was impressed.
There are definitely hallucinations written as confident statements, which is unfortunate, but the sheer number of things it got right made me appreciate just how much progress AI video analysis has made in the past year.
Asynchronous PvP Done Right
One of the most fascinating aspects of The Bazaar is that it's not real-time PvP. When you challenge another player, the battle is simulated ahead of time based on both board states, and then replayed client-side.
This means:
- The entire battle logic can be resolved deterministically.
- The server handles all randomness and trigger stacking.
- You and your opponent never actually fight live.
It makes each match feel like programming a machine — you assemble your build, press play, and watch it unfold.
Modeling trigger resolution
Look, no sane person should ever model a reactive battle simulation using `useEffect` — and yet, here we are.
This is not "good" React. This is deeply cursed React. But if you're the type to see an asynchronous combat engine and think _"hmm, I wonder if I can do this with hooks" — welcome to the club.
Here's a very dumbed-down, very readable version of what a trigger-resolution engine might look like in a React app:
TYPESCRIPT1import { useState, useEffect } from 'react';23function useBattleSimulation(players) {4 const [queue, setQueue] = useState([]);5 const [log, setLog] = useState([]);67 useEffect(() => {8 if (queue.length === 0) return;910 const timer = setTimeout(() => {11 const [next, ...rest] = queue;12 next?.execute();13 setLog((prev) => [...prev, next]);14 const newTriggers = getTriggeredActions(players);15 setQueue([...rest, ...newTriggers]);16 }, 100);1718 return () => clearTimeout(timer);19 }, [queue, players]);2021 const startBattle = (initialActions) => setQueue(initialActions);2223 return { log, startBattle };24}2526function getTriggeredActions(players) {27 return players.flatMap(player =>28 player.items.flatMap(item =>29 item.triggers30 .filter(trigger => trigger.condition())31 .map(trigger => trigger.action())32 )33 );34}
This isn't a physics engine. This is a turn-based Rube Goldberg machine where each action says "hello" to five other things, who all then scream back "me too!" and jump into the queue. It's dumb. It's delightful. It's The Bazaar.
My Build: Haste, Poison, and the Deadly Tortuga
In the match I analyzed, I built around the "Aquatic" and "Friend" tags. My hero was Vanessa, and the core idea was to create a self-reinforcing engine of:
- Poison application
- Cooldown reduction
- Trigger stacking
Key items were:
- Deadly Tortuga (big crit weapon that charges when Friend items are used)
- Heavy Pufferfish (applies Poison and Slow, charges when Hasted)
- Jellyfish / Icy Jellyfish (gain Haste from Aquatic neighbors)
- Heavy Electric Eels (charges when the opponent uses an item, slows with double duration)
I also had perks like:
- Knife Tricks: Weapon use reduces its cooldown
- Hyper Focus: Reduces cooldown on the single medium item (Pufferfish)
- Thick Hide: Charging other items when I apply Slow
Watching it all unfold felt like seeing a machine come alive.
- Eels charged from enemy actions.
- Pufferfish triggered Thick Hide and self-charged.
- Jellyfish Hasted everything around it.
- Tortuga kept getting charged from all the Friend triggers.
- Haste loops let items reactivate fast, poisoning and slowing relentlessly.
At one point, Tortuga hit for over 3400 crit damage, and then did it again a few seconds later — before the opponent had even resolved all their own item activations.
What Gemini 2.5 got right (and wrong)
Gemini correctly traced many of the major interactions — calling out which effects triggered others, explaining how the skills amplified my build, and narrating the cascade of Haste buffs and Poison ticks.
But it also confidently hallucinated a few things. Here's a breakdown of where it drifted from reality, with links to specific lines in the transcript:
- It named my hero as Pirate Queen and the opponent's as Pirate Captain. Their names are Vanessa and Pygmalien respectively.
- It guessed most of the opponent's items wrong — only the Octopus was accurate. To be fair, I didn't hover over them during the video.
- It called "Glass Cannon" a game modifier. It's actually just another player skill, same as "Knife Tricks".
- It claimed that Pufferfish gains charge when it is Hasted — not quite. It actually charges when any of your items are Hasted, which makes it significantly more powerful.
- It imagined that my opponent's third item activated to grant +1000 gold. It was actually a shield of 1000 that triggers when they used their first item (in this case, the Atlatl) due to a skill.
- The moment-to-moment damage calculations once everything starts speeding up are definitely a bit fuzzy. I didn’t verify them frame by frame — but the general idea (that the opponent dies from poison, and that my items surge forward early) is correct.
All that said, I’m still impressed. The errors were mostly based on missing visual context, and the overall logical structure — what triggered what — held together surprisingly well.
Conclusion
This kind of tooling could easily evolve into:
- Visual debuggers for card or strategy games
- Coach-like overlays for players (although as of now these tools are banned in the Bazaar, for good reason)
- Post-match analytics for tuning or learning
And beyond gaming, it reflects a big leap in how well AI can parse visual sequences governed by invisible state changes.
For now, I'm just thrilled that something I built — a synergistic, time-sensitive trigger machine — could be broken down and mostly understood by a model like Gemini.
If nothing else, it’s a fun reminder that the line between gameplay and programming has never been thinner.
Gemini Transcript
Initial State (0:00)
Player: Pirate Queen Hero (Level 17), 7070 Health. Items (Left to Right): Deadly Tortuga, Jellyfish, Heavy Pufferfish, Icy Jellyfish, Heavy Electric Eels. All items have aquatic and friend tags. Tortuga and Eels are weapons. Pufferfish is medium size; others are small/large.
Opponent: Pirate Captain Hero (Level 26), Health TBD. Items: Sword, Octopus, Binoculars, Spear, Shield.
Game Modifier (Revealed Later): Glass Cannon — Both players' weapons have double damage.
Player Perks (Revealed Later):
- Knife Tricks: Weapon use reduces its cooldown by 5% (Tortuga & Eels).
- Hyper Focus: Medium item (Heavy Pufferfish) has 30% reduced cooldown.
- Thick Hide: When you Slow, charge 1 item for 1 second (Pufferfish & Eels trigger this).
Key Item Synergies (Revealed Later):
- Tortuga: Gains 2 sec charge when another Friend item is used; has high crit chance.
- Jellyfish / Icy Jellyfish: Gain Haste when adjacent Aquatic item is used.
- Pufferfish: Gains 2 sec charge when Hasted.
- Eels: Gains 3 sec charge when enemy uses an item; double Slow duration.
Combat Begins (0:01–0:08)
0:01 Combat starts. Opponent health: 10005. Timer begins.
0:02
- Opponent: Binoculars activate (+1000 gold, likely no combat effect).
- Trigger (Eels): Charges 3 sec from enemy item use.
- Player: Heavy Pufferfish activates:
- Poison 25 to opponent (24 dmg shown, 10005 → 9981).
- Slows Spear for 2s.
- Triggers Thick Hide (charges random player item 1s).
- Player: Icy Jellyfish activates:
- Poison 4 to opponent.
- Freezes Sword 1s.
- Hasted from adjacent Aquatic (Pufferfish).
- Triggers Tortuga charge (Friend).
- Grants Haste to Pufferfish.
- Pufferfish self-charges due to Haste.
- Player: Jellyfish activates:
- Poison 7.
- Grants Haste to Jellyfish (from Pufferfish adjacency).
- Triggers Tortuga charge.
- Player: Heavy Electric Eels activate:
- 100 dmg (possibly doubled to 200).
- Slows Octopus 6s (base 3s × 2).
- Triggers Thick Hide, Icy Jellyfish Haste, Tortuga charge.
- Player: Deadly Tortuga activates:
- 1600 damage (likely doubled to 3200; possible crit). Opponent drops to ~5190.
- Player takes 488 damage.
- Hastens all player items 2s.
- Jellyfish gains Haste (Aquatic adjacency).
- Triggers Knife Tricks (cooldown -5%).
0:03
- Opponent poison ticks: -50, -13, -13 (→ ~5114).
- Shield activates: +26 armor, +160 health.
- Spear activates: -186 damage to player (→ ~6884).
- More player item activations. Status effects applied. Player gains +10 regen.
0:04
- Sword activates: Two crits (-240, -280). Player health ~4938.
- Octopus activates: -262 damage (→ ~4676).
- Items keep activating. +10 regen. Opponent health drops.
0:05
- Tortuga activates again:
- -3400 CRIT (1600 × 2 × crit). Opponent nearly dead.
- Items hasted again.
- Knife Tricks cooldown reduction.
- Spear activates (CRIT): -1640 damage. Player ~3308.
- Items continue cycling.
0:06
- More crits land (-352, -1760). Likely Sword/Octopus. Player ~1196.
- Player continues activations. +10 regen.
0:07
- Sword activates: -440 CRIT. Player ~756.
- Binoculars activate again.
- Pufferfish poisons again — possibly lethal tick.
0:08 Opponent defeated.
Post-Combat (0:09–0:22)
0:09–0:10: Victory screen. Player health: 1196. 0:11–0:12: Glass Cannon revealed. 0:13–0:22: Player reviews perks and items — confirms full synergy stack.
Summary
The player won using a fast-paced, synergistic build focused on Aquatic and Friend tags, leveraging Haste and Charge mechanics:
- Enemy actions charged the Eels.
- Pufferfish and Eels' Slows triggered Thick Hide.
- Aquatic activations Hasted the Jellyfish.
- Friend tags repeatedly charged Tortuga.
- Hasted Pufferfish self-charged.
This feedback loop caused rapid item cycling, constant status effects, and overwhelming weapon damage — securing victory before the opponent's own Glass Cannon boosts could take full effect.